﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using TCC.ControleFluxoDeCaixa.Model.Fluxo;
using TCC.ControleFluxoDeCaixa.Model.Fluxo.Credito;


namespace TCC.ControleFluxoDeCaixa.Apresentacao.ViewModels.Credito
{
    public class FaturaCreditoResumo
    {
        public ContaCredito ContaCredito { get; set; }
        private int MesReferencia { get; set; }
        private int AnoReferencia { get; set; }

        public FaturaCreditoResumo(ContaCredito contaCredito, int mesReferencia, int anoReferencia, IEnumerable<Movimento> movimentos, FaturaCreditoResumo fatAnterior)
        {
            ContaCredito = contaCredito;
            MesReferencia = mesReferencia;
            AnoReferencia =  anoReferencia;
            Movimentos = movimentos.ToArray(); 
            Fatura = ContaCredito.Faturas.SingleOrDefault(f => f.Ano == anoReferencia && f.Mes == mesReferencia);
            FaturaAnterior = fatAnterior;
        }

        public FaturaCreditoResumo FaturaAnterior { get;private set; }

        public decimal ValorReal
        {
            get
            {
                return Fatura == null
                    ? (-(Movimentos.Sum(m => (decimal?)((int)m.TipoDeMovimento) * m.ValorAbsoluto) ?? 0) + SobraFaturaAnterior)
                    : Fatura.Valor;
            } 

        }
        public decimal Valor
        {
            get
            {
                return Fatura == null
                    ? (-(Movimentos.Sum(m => (decimal?)((int)m.TipoDeMovimento) * m.ValorAbsoluto) ?? 0))
                    : Fatura.Valor;
            }

        }
        public FaturaCredito Fatura { get; set; }
        public DateTime DataVencimento
        {
            get { return Movimentos.First().DataDoMovimento; }
        }

        public DateTime DataFechamento
        {
            get
            {
                var datafechamento = Movimentos.First()
                    .DataDoMovimento.AddDays(-ContaCredito.QtdDiasPeriodoFechamento);
               
                return datafechamento;
            }
        }

        public StatusPagamento Status
        {
            
            get
            {
                if (Saldo == ValorReal)
                {
                    return (StatusPagamento.NaoLiquidado);
                }
                if (Saldo > 0 && Saldo < ValorReal)
                {
                    return (StatusPagamento.ParcialmenteQuitado);
                }
                return (StatusPagamento.Liquidado);
            }
        }

        public IEnumerable<Movimento> Movimentos { get; set; }

        public decimal Saldo
        {
            get { return -Movimentos.Sum(c => c.Valor) + SobraFaturaAnterior; }
        }

        private decimal? _sobraFaturaAnterior;
        public decimal SobraFaturaAnterior
        {
            get { return (decimal) (_sobraFaturaAnterior = (_sobraFaturaAnterior ?? (FaturaAnterior == null ? 0 : FaturaAnterior.Saldo))); }
        }

        public string AnoMes
        {
            get { return DataFechamento.ToString("yyyy/MM"); }
        }

        public int Ano
        {
            get
            {
                return DataFechamento.Year;
            }
        }  

        public int Mes { get { return DataFechamento.Month; } }
    }
}
